home *** CD-ROM | disk | FTP | other *** search
- ⓪ (* (C) 1989, 1990 by Johannes Leckebusch *)⓪ (* Portiert für MM2: 7. 6. 89 *)⓪ ⓪ (* 12.12.90 TT Puffer werden hier statt in GMEBase angelegt,⓪1um zirkul. Import zw. GMEBase & GMEConfig zu lösen;⓪1FastLen wieder in Assembler;⓪1Ctrl-Z wird in FastLen als Ende erkannt;⓪1Meldung "Config laden" nur, wenn's wirklich geladen wird;⓪1Wenn ungültiger Text gelesen wird, kommt entspr.⓪1Fehlermeldung und TextLesen bricht ab - allerdings⓪1wird Puffer noch nicht dann wieder gelöscht!⓪#13.12.90 TT Konstante 'DefaultConfigName' definiert, die Datei heißt⓪1wieder "GME.GME", weil's so im Handbuch steht.⓪1Meldung, daß .GME nicht gefunden, erscheint nun mit vollst.⓪1Dateinamen (also z.B. "GME.GME" statt nur ".GME") und⓪1dahinter wird ein CR/LF ausgegeben, damit das evtl. folgende⓪1"Text laden" nicht direkt dahinter steht.⓪#17.12.90 TT Fix vom 16.12. von JL wg. Absturz bei ^QE in TextSchreiben⓪1eingesetzt.⓪#18.12.90 TT Letzte Zeile wird von TextLesen nun korrekt geladen;⓪1Fehlerabfrage beim Anlegen ALLER Puffer -> OutOfMemory-Meldg.;⓪1TextSchreiben: Handles werden auf neg. Werte und nicht mehr⓪1"<6" verglichen; TextSchreiben: Letzte Zeile wird nicht mit⓪1CR/LF versehen.⓪#09.03.91 TT TextSchreiben: liefert Erfolgswert; GME.GME wird nur geladen,⓪1wenn "KonfigSpeichern" aktiv ist.⓪ *)⓪ ⓪ (*$R-*)⓪ (*$Y+*)⓪ (*$Z+*)⓪ ⓪ IMPLEMENTATION MODULE GMEFile;⓪ ⓪ ⓪ (* The Little Golem Editor. Begonnen 13. 06. 86⓪#(C) 1986, 1990 by Johannes Leckebusch⓪#Version: Siehe ceditor⓪#Stand: 28. 02. 88⓪ *)⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS, ADR, CAST;⓪ (* FROM Storage IMPORT ALLOCATE, DEALLOCATE; *)⓪ FROM Granule IMPORT ALLOCATE, DEALLOCATE;⓪ ⓪ FROM GEMDOS IMPORT IOMode, Open, Create, Close, Delete, Read, Write, Rename,⓪"DaTime, TimeAccessMode;⓪ ⓪ FROM EasyGEM1 IMPORT MakeScrapName;⓪ FROM PrgCtrl IMPORT ActiveProcess;⓪ FROM SystemError IMPORT OutOfMemory;⓪ ⓪ FROM Strings IMPORT Append, Assign, Copy;⓪ FROM FastStrings IMPORT Pos;⓪ IMPORT FastStrings, Paths, Lists, Directory, ShellMsg, PathCtrl, FileNames;⓪ FROM ShellMsg IMPORT ShellPath;⓪ ⓪ (* FROM MyConversions IMPORT ConvCard; *)⓪ FROM Convert IMPORT ConvCard;⓪ ⓪ FROM GMEConfig IMPORT ConfigInit, InitConfig;⓪ ⓪ FROM GMEBase IMPORT WriteConst, WriteLn, WriteChar, Trace,⓪(bel, cr, eot, lf, tab, nul, LinesOnScreen,⓪(⓪(PuffRecSize, cRevision,⓪(InitBuffer,⓪(LoescheBild, LoescheZeile,⓪(WriteLine, HighLight, Normal, GotoXY, CursorEin, CursorAus,⓪(Nachricht, FrageJaNein, Ja, Nein, MausEin, MausAus, MausBusy,⓪(GetVersion,⓪(PuffInit,⓪(UndoPuffer, ClipBoard, HilfsPuffer, ConfigPuffer,⓪(EditPuffer, AlternEdit, DruckPuff, MailPuffer,⓪(Tausch, GolemPuffer, PSCPuffer, FehlerPuffer;⓪ ⓪ FROM GMEBase IMPORT DeleteTail, GetDirectory, GetPfad;⓪ ⓪ FROM GMEBase IMPORT cZeile, cTabWeite, cKopfVorlauf, cKopfNachlauf,⓪(cZeilenAbstand, cSpiegel, cOffset;⓪ ⓪ FROM GMEBase IMPORT Mode, CharSet,⓪(einPufferPointer, eineInfo, eineZeile,⓪(einLinePointer, Moden, MerkIndex,⓪(einMerkPunkt, einMerkPointer, einStringPointer, einMerkSet;⓪ ⓪ FROM GMEBase IMPORT Loeschen, Init, AllocLine, PutLine,⓪(AutoCount, InsertPuffer;⓪ ⓪ (* FROM EditCommand IMPORT SplitFileName; *)⓪ ⓪ FROM GMEKernel IMPORT SchirmSchreiben;⓪ ⓪ FROM GMEKernel IMPORT LineUp, InsertLine, StelleZeileEin, SucheZeilenPointer;⓪ ⓪ (* Bemerkung: StringZeilen werden als >>Zeile<<, Pointer-Objekte⓪#als >>Line<< bezeichnet *)⓪ ⓪ CONST cpuffer = 32767;⓪(cgrain = 16; (* Hm - das war natürlich Granule... *)⓪(⓪(DefaultConfigName = 'GME.GME';⓪ ⓪ TYPE einPuffer = ARRAY [0..cpuffer] OF CHAR;⓪(PufferPointer = POINTER TO einPuffer;⓪ ⓪ VAR version: eineInfo;⓪(puffer: PufferPointer;⓪ ⓪ ⓪ (************************* aus GMEBase *******************************)⓪ ⓪ PROCEDURE LoadConfig (Puff: einPufferPointer; frage, message: BOOLEAN);⓪ VAR Info: eineInfo;⓪(filehandle: INTEGER;⓪(ok: BOOLEAN;⓪(button: INTEGER;⓪ VAR PName: eineInfo;⓪(LSIZE: LONGCARD;⓪(mind: MerkIndex;⓪(dot, star: ARRAY [0..0] OF CHAR; (* Compilerfehler! *)⓪(i: CARDINAL;⓪(ch: CHAR;⓪(chp: POINTER TO CHAR;⓪ ⓪$PROCEDURE ReadZeile (VAR lp: einLinePointer);⓪$VAR LSIZE: LONGCARD;⓪.l: eineZeile;⓪.ind: CARDINAL;⓪$BEGIN⓪&LSIZE := 1; ind := 0;⓪&WHILE (ch # cr) & (ch # eot) & (ind < cZeile) & (LSIZE = 1L) DO⓪&(* Achtung: Falls tatsaechlich zuviele Zeichen im String,⓪)werden nicht alle gelesen! (ind < cZeile) *)⓪(l [ind] := ch; INC (ind);⓪(Read (filehandle, LSIZE, chp);⓪&END (* WHILE *);⓪&l [ind] := nul;⓪&(* merkinfo ist nicht alloziiert! *)⓪&AllocLine (lp, 0);⓪&IF lp = NIL THEN⓪(Nachricht ('Kein Platz für|Zeileninfo.113');⓪&ELSE⓪(PutLine (lp, l);⓪&END;⓪$END ReadZeile;⓪ ⓪ (*⓪$PROCEDURE LoadMerkpunktListe (VAR mp: einMerkPunkt);⓪$VAR mpp, hp: einMerkPointer;⓪,Ende: BOOLEAN;⓪"⓪&PROCEDURE LoadMerkpunkt (VAR p: einMerkPointer);⓪&VAR LSIZE: LONGCARD;⓪(VAR lp: einLinePointer;⓪(⓪&BEGIN (* LoadMerkpunkt *)⓪((* Merkpunkt-Record lesen: *)⓪(NEW (p);⓪(IF p = NIL THEN⓪*Nachricht ('Kein Platz für|Merkpunkt.114');⓪*Ende := TRUE; RETURN;⓪(END;⓪(LSIZE := LONG (SIZE (p^));⓪(Read (filehandle, LSIZE, p);⓪((* p^.nextMerk enthaelt alten Pointerwert, dieser darf⓪+jedoch nur auf NIL verglichen werden! *)⓪(WITH p^ DO⓪*merkline := Puff^.Puffer^.naechste; (* erste effektive Textzeile *)⓪ ⓪*(* Infostring lesen: *)⓪ ⓪*IF merkinfo # NIL THEN⓪,lp := merkinfo;⓪,chp := ADR (ch); LSIZE := 1;⓪,Read (filehandle, LSIZE, chp);⓪,WHILE (ch # eot) & (LSIZE = 1) DO⓪.ReadZeile (merkinfo);⓪.Read (filehandle, LSIZE, chp);⓪.IF ch # eot THEN⓪0AllocLine (merkinfo^.naechste, 0);⓪0IF merkinfo^.naechste = NIL THEN⓪2Nachricht ('Kein Platz für|Zeileninfo.115');⓪2Ende := TRUE; RETURN;⓪0END;⓪0merkinfo^.naechste^.vorige := merkinfo;⓪0merkinfo := merkinfo^.naechste;⓪.END (* IF *);⓪,END (* WHILE NOT ^Z *);⓪*END (* IF Infostring lesen *);⓪*⓪(END (* WITH *);⓪&END LoadMerkpunkt;⓪&⓪$BEGIN (* LoadMerkpunktListe *)⓪&IF mp.nextMerk # NIL THEN⓪((* WriteLn; WriteConst (' Lade Merkpunktliste'); *)⓪(LoadMerkpunkt (mp.nextMerk);⓪(mpp := mp.nextMerk; Ende := FALSE;⓪(WHILE (mpp^.nextMerk # NIL) & ~Ende DO⓪*LoadMerkpunkt (mpp^.nextMerk);⓪*mpp := mpp^.nextMerk;⓪(END (* WHILE *);⓪&END (* IF *);⓪$END LoadMerkpunktListe;⓪ *)⓪ BEGIN (* LoadConfig *)⓪"(* IF ~FrageJaNein (1, 'Texteinstellungen laden') THEN RETURN; END; *)⓪ ⓪"dot [0] := '.'; (* Compilerfehler - keine Char-Konstante erlaubt! *)⓪"star [0] := '*';⓪"(* REPEAT *)⓪"IF frage THEN CursorAus;⓪%LoescheBild;⓪%HighLight; WriteLine (version);⓪%Normal; WriteLn; WriteLn;⓪"END (* IF frage *);⓪"⓪$WITH Puff^ DO⓪&FileNames.ConcatName (Pfad, 'GME', Pfad);⓪&FileNames.ConcatName (Name, 'GME', Name);⓪$END;⓪$⓪$Info := Puff^.Pfad; DeleteTail (Info);⓪$FastStrings.Append (Puff^.Name, Info);⓪$IF frage THEN⓪&(* WriteConst (' Text-Konfiguration lesen: '); *)⓪&HighLight; WriteConst (Info); Normal;⓪&GetDirectory (Puff^.Pfad, Puff^.Name, 'GME lesen', button, FALSE);⓪&IF (button # 1) THEN⓪((*IF expand THEN RETURN; END;*)⓪(InitConfig (Puff);⓪(CursorEin; RETURN;⓪&END;⓪&Info := Puff^.Pfad; DeleteTail (Info);⓪&FastStrings.Append (Puff^.Name, Info);⓪$END (* IF frage *);⓪ ⓪$Open (Info, ORD (read), filehandle);⓪$(* frage := TRUE; *)⓪ ⓪"IF ~(filehandle >= 0) THEN⓪$(* Nachricht ('.GME-Datei nicht gefunden!'); *)⓪ ⓪$HighLight; WriteLine (Puff^.Name);⓪$WriteConst (' nicht gefunden!'); Normal;⓪$WriteLn;⓪ ⓪$InitConfig (Puff);⓪$EXCL (Puff^.Modus, KonfigSpeichern);⓪$RETURN;⓪"END (* IF *);⓪"IF message THEN⓪$WriteConst ('Config laden');⓪$WriteLn;⓪"END;⓪"MausBusy;⓪"LSIZE := 4;⓪"Read (filehandle, LSIZE, Puff);⓪"IF Puff^.MagicRevision # cRevision THEN⓪$ok := Close (filehandle);⓪$Nachricht ('GME-Datei inkompatibel');⓪$InitConfig (Puff);(* Puff^.MagicRevision := 0;*)⓪$CursorEin;⓪$RETURN;⓪"END (* IF *);⓪"LSIZE := PuffRecSize - 4L;⓪"Read (filehandle, LSIZE, ADDRESS (Puff) + 4L);⓪"EXCL (Puff^.Modus, Editiert);⓪"(* EXCL (Puff^.Modus, ScanText); (* Flag steuert PSC-Interpreter! *) *)⓪"⓪"(* Merkinfo der festen Merkpunkte laden: *)⓪"⓪"FOR mind := ErsteZeile TO LetztePosition DO⓪$(* Trace (' Merkpunkt laden...'); *)⓪$WITH Puff^.MerkPunkte [mind] DO⓪&IF merkinfo # NIL (* alter String war vorhanden *)⓪(THEN chp := ADR (ch); LSIZE := 1;⓪-Read (filehandle, LSIZE, chp);⓪-ReadZeile (merkinfo);⓪&END (* IF merkinfo *);⓪$END (* WITH *);⓪"END (* FOR *);⓪ ⓪ (*⓪"(* Merklisten laden: *)⓪"⓪"IF expand THEN⓪$FOR mind := ErsteZeile TO LetztePosition DO⓪&WITH Puff^ DO⓪(LoadMerkpunktListe (MerkPunkte [mind]);⓪&END (* WITH *);⓪$END (* FOR *);⓪"END (* IF *);⓪ *)⓪ ⓪"(* File schliessen *)⓪"ok := Close (filehandle);⓪"MausEin; CursorEin;⓪ END LoadConfig;⓪ ⓪ PROCEDURE SaveConfig (Puff: einPufferPointer; frage: BOOLEAN);⓪ (* Speichere die in listen genannten Merkpunktlisten, sonst nur den⓪#Kopfrecord des Textpufferdescriptors *)⓪ ⓪ VAR Name, BakName, Pfad: eineInfo;⓪(filehandle: INTEGER;⓪(ok: BOOLEAN;⓪(dot, star: ARRAY [0..0] OF CHAR; (* Compilerfehler! *)⓪(PName: eineInfo;⓪(i: CARDINAL;⓪(button: INTEGER;⓪(LSIZE: LONGCARD;⓪(mind: MerkIndex;⓪ ⓪"PROCEDURE WriteInfo (lp: einLinePointer);⓪"VAR ch: CHAR;⓪"BEGIN⓪$LSIZE := LONG (LENGTH (lp^.ZeilPointer^)); (* ERROR *)⓪$Write (filehandle, LSIZE, lp^.ZeilPointer);⓪$ch := cr; LSIZE := 1;⓪$Write (filehandle, LSIZE, ADR (ch));⓪"END WriteInfo;⓪ ⓪ (*⓪"PROCEDURE SaveMerkpunktListe (mp: einMerkPunkt);⓪"VAR mpp: einMerkPointer;⓪ ⓪$PROCEDURE SaveMerkpunkt (p: einMerkPointer);⓪$VAR LSIZE: LONGCARD;⓪0lp: einLinePointer;⓪0ch: CHAR;⓪$BEGIN⓪&(* Merkpunkt-Record schreiben: *)⓪&LSIZE := LONG (SIZE (p^));⓪&Write (filehandle, LSIZE, p);⓪&WITH p^ DO⓪&⓪((* Infostring schreiben: *)⓪&⓪(IF merkinfo # NIL THEN⓪*lp := merkinfo;⓪*WHILE lp # NIL DO⓪,WriteInfo (lp);⓪,lp := lp^.naechste;⓪*END (* WHILE *);⓪(END (* IF Infostring schreiben *);⓪(ch := eot; (* ^Z *)⓪(LSIZE := 1;⓪(Write (filehandle, LSIZE, ADR (ch));⓪&END (* WITH p^ *);⓪$END SaveMerkpunkt;⓪$⓪"BEGIN (* SaveMerkpunktListe *)⓪$mpp := mp.nextMerk;⓪$WHILE mpp # NIL DO⓪&SaveMerkpunkt (mpp);⓪&mpp := mpp^.nextMerk;⓪$END (* WHILE *);⓪"END SaveMerkpunktListe;⓪ *)⓪ ⓪ BEGIN (* SaveConfig *)⓪ (*⓪"IF ~FrageJaNein (1, 'Texteinstellungen speichern') THEN RETURN; END;⓪ *)⓪"dot [0] := '.'; (* Compilerfehler - keine Char-Konstante erlaubt! *)⓪"star [0] := '*';⓪"IF frage THEN⓪$Name := DefaultConfigName;⓪"ELSE⓪$(*⓪$Name := Puff^.Name;⓪$IF Pos (dot, Name) >= 0 THEN⓪&(* Suffix entfernen: *)⓪&i := LENGTH (Name); DEC (i);⓪&WHILE Name [i] # '.' DO⓪(DEC (i);⓪&END (* WHILE *);⓪&Name [i] := nul;⓪$END (* IF Punkt *);⓪$IF Name [0] = nul THEN FastStrings.Assign (star, Name); END;⓪$FastStrings.Append ('.GME', Name);⓪$*)⓪$FileNames.ConcatName (Puff^.Name, 'GME', Name);⓪"END (* IF frage *);⓪"⓪"(* Meldung in die obersten Bildschirmzeilen schreiben: *)⓪"⓪"(* LoescheBild; *)⓪"GotoXY (0, 0); CursorAus;⓪"HighLight; WriteLine (version); Normal; LoescheZeile;⓪"WriteLn; LoescheZeile; WriteLn; LoescheZeile;⓪"HighLight; WriteConst (' Text-Konfiguration schreiben: ');⓪"Pfad := Puff^.Pfad; DeleteTail (Pfad);⓪"WriteConst (Pfad); WriteConst (Name); Normal; LoescheZeile;⓪"WriteLn; LoescheZeile;⓪"⓪"IF frage THEN⓪$FileNames.ConcatPath (ShellPath, DefaultConfigName, PName);⓪"ELSE⓪$(*⓪$PName := Puff^.Pfad;⓪$IF Pos (dot, PName) >= 0 THEN⓪&i := LENGTH (PName); DEC (i);⓪&WHILE PName [i] # '.' DO⓪(DEC (i);⓪&END (* WHILE *);⓪&PName [i] := nul;⓪$END (* IF Punkt *);⓪$IF PName [0] = nul THEN FastStrings.Assign (star, PName); END;⓪$FastStrings.Append ('.GME', PName);⓪$*)⓪$FileNames.ConcatName (Puff^.Pfad, 'GME', PName);⓪"END (* IF frage *);⓪"⓪"IF (* frage OR *) (Name [0] = nul) THEN⓪$(* Filename vom Benutzer holen: *)⓪$GetDirectory (PName, Name, '*.GME speichern', button, FALSE);⓪$IF button # 1 THEN (* Abbruch-Knopf gedrueckt *)⓪&RETURN;⓪$END;⓪"END (* IF frage *);⓪"⓪"IF Name [0] = nul THEN⓪$Nachricht('Sie müssen einen Dateinamen angeben!');⓪$RETURN;⓪"END (* IF kein Name *);⓪"BakName := Name;⓪"Pfad := PName; DeleteTail (Pfad);⓪"FastStrings.Append (BakName, Pfad);⓪ ⓪"(* Alte Datei in .OLD umbenennen *)⓪"IF (MakeBAK IN Puff^.Modus) THEN⓪$FileNames.ConcatName (Pfad, 'OLD', BakName);⓪$ok := Delete (BakName);⓪$Rename (Pfad, BakName);⓪"END (* IF ~MakeBAK *);⓪"⓪"(* Neue Datei anlegen: *)⓪"⓪"MausBusy;⓪"⓪"Create (Pfad, 0, filehandle);⓪"IF filehandle < 0 THEN⓪$Nachricht ('Fehler beim Erzeugen der .GME-Datei');⓪$RETURN;⓪"END (* IF Handle ungueltig *);⓪"⓪"(* Deskriptor-Record schreiben: *)⓪"⓪"LSIZE := PuffRecSize;⓪"Write (filehandle, LSIZE, Puff);⓪"⓪"(* Merkinfo der festen Merkpunkte speichern: *)⓪"⓪"FOR mind := ErsteZeile TO LetztePosition DO⓪$WITH Puff^.MerkPunkte [mind] DO⓪&IF merkinfo # NIL THEN⓪(WriteInfo (merkinfo);⓪&END (* IF *);⓪$END (* WITH *);⓪"END (* FOR *);⓪ ⓪ (*⓪"(* Merkpunktlisten speichern: *)⓪"⓪"FOR mind := ErsteZeile TO LetztePosition DO⓪$IF mind IN listen THEN⓪&WITH Puff^ DO⓪(SaveMerkpunktListe (MerkPunkte [mind]);⓪&END (* WITH *);⓪$END (* IF mind IN listen *);⓪"END (* FOR *);⓪ *)⓪"⓪"(* Datei schliessen: *)⓪"⓪"ok := Close (filehandle);⓪"MausEin; CursorEin;⓪ END SaveConfig;⓪ ⓪ ⓪ PROCEDURE TextVorhanden (Name: ARRAY OF CHAR): BOOLEAN;⓪ VAR h: INTEGER;⓪(ok: BOOLEAN;⓪ BEGIN⓪"Open (Name, ORD (read), h);⓪"IF h >= 0 THEN⓪$ok := Close (h); RETURN TRUE;⓪"ELSE RETURN FALSE;⓪"END (* IF *);⓪ END TextVorhanden;⓪ ⓪ PROCEDURE TextLoeschen (Name: ARRAY OF CHAR);⓪ VAR ok: BOOLEAN;⓪ BEGIN⓪"ok := Delete (Name);⓪ END TextLoeschen;⓪ ⓪ PROCEDURE ReInit (Puff: einPufferPointer);⓪ (* Initialisiere Puffer nach LoadConfig, ohne ??? *)⓪ VAR merkindex: MerkIndex;⓪ BEGIN⓪"WITH Puff^ DO⓪$ZeilenAnzahl := 1; (* da sie durch Laden inkrementiert wird! *)⓪$MerkPunkte [LaufendeZeile].zeilpos := 1;⓪$AllocLine (Puffer, 0);⓪$IF Puffer = NIL THEN RETURN; END;⓪$WITH Puffer^ DO⓪&AllocLine (naechste, 0);⓪&naechste^.vorige := Puffer;⓪$END (* WITH *);⓪"END (* WITH *);⓪"FOR merkindex := ErsteZeile TO LaufendeZeile DO⓪$WITH Puff^.MerkPunkte [merkindex] DO⓪&merkline := Puff^.Puffer^.naechste;⓪$END (* WITH *);⓪"END (* FOR *);⓪ END ReInit;⓪ ⓪ VAR expandBlankCompr: BOOLEAN;⓪ ⓪ CONST DLE = 20C;⓪&ctrlZ = CHR (26);⓪ ⓪(⓪"PROCEDURE LiesPuffer (VAR index, ende: LONGCARD; texthandle: INTEGER);⓪"(* Diese Routine liest möglichst schnell einen Textblock aus der Datei⓪%"texthandle" in den internen Puffer (puffer). Dabei wird festgehalten,⓪%wo das Ende des gültigen Textinhaltes steht (globaler Parameter ende).⓪%"index" wird wieder auf Null gesetzt, außer es war vorher schon Null,⓪%dann auf 1. Dann ist nämlich index > ende, was das Ende des Textes⓪%bedeutet.⓪#*)⓪%⓪"BEGIN⓪$(*Trace ('LiesPuffer');*)⓪$index := VAL (LONGCARD, cpuffer) + 1L; (* versuche, ganzen Block zu les. *)⓪$Read (texthandle, index, ADDRESS (puffer)); (* wird i. d. R. cpuffer + 1 *)⓪$(*Trace ('Read fertig');*)⓪$ende := index;⓪$(* Anzahl gelesener Zeichen, im Fehlerfall eigentlich negative LONGINT *)⓪$IF (ende > (*VAL (LONGCARD, 0)*) 0L) THEN⓪&(*Trace ('ende > 0');*)⓪&index := (*VAL (LONGCARD, 0)*) 0L; DEC (ende); (* Da 0-based, ist der gueltige Index⓪Adie Anzahl Zeichen - 1 *)⓪>(* Index auf 0, um Puffer vom Anfang aus-⓪Azulesen *)⓪$ELSE index := 1; (* index > ende! *)⓪$END (* IF *);⓪$(*Trace ('LiesPuffer fertig');*)⓪"END LiesPuffer;⓪ ⓪ PROCEDURE FastLen ( texthandle: INTEGER;⓪3VAR index, ende: LONGCARD; TabWeite: CARDINAL;⓪3VAR blanks, len, endindex: CARDINAL;⓪3VAR zeilenende, dateiende: BOOLEAN): BOOLEAN;⓪ (* Diese Funktion ermittelt die effektive Länge einer Zeile im Puffer.⓪#Sie startet ab der globalen Variablen index und liefert den endindex⓪#in Puffer. "len" ist die expandierte Länge, dh. die Länge der zu⓪#kopierenden Zeile, wenn Tabs und DLE expandiert werden. Die Funktion⓪#liefert TRUE, wenn Zeile ungültige Daten enthält⓪!*)⓪ VAR end: CARDINAL;⓪&error, first, fertig: BOOLEAN;⓪ BEGIN⓪"(*⓪$endindex := VAL (CARDINAL, index); end := VAL (CARDINAL, ende);⓪$len := 0; blanks := 0;⓪$zeilenende := FALSE; fertig := FALSE;⓪$IF dateiende OR (endindex > end) THEN RETURN FALSE; END;⓪$error:= FALSE;⓪$first:= TRUE;⓪$REPEAT⓪&CASE puffer^ [endindex] OF⓪((* DLE darf nur am Zeilenanfang stehen... *)⓪(DLE: IF NOT first THEN⓪2error:= TRUE;⓪2fertig := TRUE;⓪2zeilenende := TRUE;⓪0INC (endindex); (* Skip DLE *) INC (index);⓪0IF (endindex > end) THEN⓪2LiesPuffer (index, ende, texthandle);⓪2endindex := VAL (CARDINAL, index);⓪2end := VAL (CARDINAL, ende);⓪0END (* IF *);⓪0IF (ORD (puffer^[endindex]) >= ORD (' ')) THEN⓪2blanks := ORD (puffer^[endindex]) - ORD (' ');⓪0ELSE⓪2error:= TRUE;⓪0END (* IF *);⓪0INC (index);⓪(|⓪(lf: INC (index); (* Skip Linefeed *);⓪(|⓪(tab: INC (len,⓪2TabWeite * ((len + blanks) DIV TabWeite + 1)⓪3- len);⓪(|⓪(cr: fertig := TRUE;⓪0zeilenende := TRUE;⓪(|⓪(ctrlZ: dateiende:= TRUE; fertig:= TRUE⓪(|⓪(ELSE INC (len);⓪&END (* CASE *);⓪&first:= FALSE;⓪&INC (endindex); IF endindex > end THEN fertig := TRUE; END;⓪$UNTIL fertig;⓪ *)⓪"ASSEMBLER⓪&; endindex := VAL (CARDINAL, index); end := VAL (CARDINAL, ende);⓪&MOVE.L index(A6),A0⓪&MOVE.L endindex(A6),A1⓪&MOVE.L (A0),D1⓪&MOVE D1,(A1)⓪&MOVE.L ende(A6),A0⓪&MOVE.L (A0),D2⓪&MOVE D2,end(A6)⓪&; len := 0; blanks := 0;⓪&MOVE.L len(A6),A0⓪&CLR (A0)⓪&MOVE.L blanks(A6),A0⓪&CLR (A0)⓪&; zeilenende := FALSE; fertig := FALSE; first:= TRUE; error:= FALSE;⓪&MOVE.L zeilenende(A6),A0⓪&CLR (A0)⓪&CLR first(A6)⓪&CLR error(A6)⓪&; IF dateiende OR (endindex > end) THEN RETURN FALSE; END;⓪&MOVE.L dateiende(A6),A0⓪&TST (A0)⓪&BNE.W endRepeat⓪&CMP.L D2,D1⓪&BLS repeat⓪&BRA.W endRepeat⓪ ⓪&; REPEAT⓪$repeat:⓪&; CASE puffer^ [endindex] OF⓪&MOVE.L endindex(A6),A1⓪&MOVE (A1),D1⓪&MOVE.L puffer,A0⓪&MOVE.B 0(A0,D1.W),D0⓪ ⓪&CMPI.B #DLE,D0⓪&BNE noDLE⓪ ⓪&; IF ~first THEN <ende> END;⓪&; INC (endindex); INC (index);⓪&; IF (endindex > end) THEN⓪&; LiesPuffer (index, ende, texthandle);⓪&; endindex := VAL (CARDINAL, index); end := VAL (CARDINAL, ende);⓪&; END (* IF *);⓪&; blanks:= ORD (puffer^[endindex]) - ORD (' ');⓪&; INC (index);⓪&TAS first(A6)⓪&BPL isfirst⓪$isnotext:⓪&; Garbage im File!⓪&MOVE #1,error(A6)⓪&BRA.W endOfLine⓪$isfirst:⓪&ADDQ #1,D1 ; endindex⓪&MOVE D1,(A1)⓪&MOVE.L index(A6),A0⓪&ADDQ.L #1,(A0)⓪&MOVE end(A6),D0⓪&CMP D0,D1⓪&BLS not1⓪&END;⓪(LiesPuffer (index, ende, texthandle);⓪&ASSEMBLER⓪&MOVE.L index(A6),A0⓪&MOVE.L endindex(A6),A1⓪&MOVE.L (A0),D1⓪&MOVE D1,(A1)⓪&MOVE.L ende(A6),A0⓪&MOVE.L (A0),D2⓪&MOVE D2,end(A6)⓪$not1:⓪&MOVE.L puffer,A0⓪&MOVE.L endindex(A6),A1⓪&MOVE (A1),D1⓪&MOVEQ #0,D0⓪&MOVE.B 0(A0,D1.W),D0⓪&SUBI.B #' ',D0⓪&BCS isnotext⓪&MOVE.L blanks(A6),A0⓪&MOVE D0,(A0)⓪&MOVE.L index(A6),A0⓪&ADDQ.L #1,(A0)⓪&BRA.W endCase⓪ ⓪$noDLE:⓪&; lf: INC (index); (* Skip Linefeed *);⓪&CMPI.B #lf,D0⓪&BNE noLF⓪&MOVE.L index(A6),A0⓪&ADDQ.L #1,(A0)⓪&BRA.W endCase⓪ ⓪$noLF:⓪&; tab: INC (len, TabWeite * ((len + blanks) DIV TabWeite + 1) - len);⓪&CMPI.B #tab,D0⓪&BNE noTAB⓪&MOVE TabWeite(A6),D1⓪&MOVE D1,D2⓪&ADDQ #1,D2⓪&MOVE.L len(A6),A0⓪&MOVE.W (A0),D0⓪&MOVE.L blanks(A6),A0⓪&ADD (A0),D0⓪&MULU D1,D0⓪&DIVU D2,D0⓪&MOVE.L len(A6),A0⓪&SUB (A0),D0⓪&ADD D0,(A0)⓪&BRA endCase⓪ ⓪$noTAB:⓪&; cr: fertig := TRUE; zeilenende := TRUE;⓪&CMPI.B #cr,D0⓪&BNE noCR⓪ ⓪$endOfLine⓪&MOVE.L zeilenende(A6),A0⓪&MOVE #1,(A0)⓪&MOVE.L endindex(A6),A0⓪&ADDQ #1,(A0)⓪&BRA endRepeat⓪ ⓪$noCR:⓪&CMPI.B #ctrlZ,D0⓪&BNE noEOF⓪&⓪&MOVE.L dateiende(A6),A0⓪&MOVE #1,(A0)⓪&BRA endRepeat⓪&⓪$noEOF:⓪&MOVE.L len(A6),A0⓪&ADDQ #1,(A0)⓪ ⓪$endCase:⓪&; INC (endindex); IF endindex > end THEN fertig := TRUE; END;⓪&MOVE.L endindex(A6),A0⓪&ADDQ #1,(A0)⓪&MOVE (A0),D0⓪&MOVE end(A6),D1⓪&CMP D1,D0⓪&BHI endRepeat⓪ ⓪&; UNTIL fertig;⓪&BRA repeat⓪ ⓪$endRepeat:⓪"END;⓪"RETURN error⓪ END FastLen;⓪ ⓪ PROCEDURE FastCopyExpand (VAR index, ende: LONGCARD; texthandle: INTEGER;⓪:TabWeite: CARDINAL;⓪:blanks, laenge, end: CARDINAL; VAR z: ARRAY OF CHAR);⓪ (* Kopiert Zeile oder Zeilenteil von⓪#start..end aus puffer^ in Zielstring. Expandiert Tab-Codes.⓪ *)⓪ VAR ztab: CARDINAL;⓪&start, zindex: CARDINAL;⓪ BEGIN⓪ (*⓪$zindex := 0;⓪$start := VAL (CARDINAL, index); laenge := laenge + blanks;⓪ ⓪$(* !JL 11. 12. 90 *)⓪$IF laenge > HIGH (z) THEN⓪&Nachricht ('Sourcezeile ist zu lang!');⓪&laenge := HIGH (z);⓪$END (* IF *);⓪$⓪$WHILE blanks > zindex DO⓪&z [zindex] := ' '; INC (zindex);⓪$END (* WHILE *);⓪$WHILE zindex < laenge DO⓪&CASE puffer^[start] OF⓪(tab: ztab := TabWeite * (zindex DIV TabWeite + 1);⓪0WHILE (zindex < ztab) DO⓪2z [zindex] := ' '; INC (zindex);⓪0END (* WHILE *);⓪(|⓪(ELSE z [zindex] := puffer^[start]; INC (zindex);⓪&END (* CASE *);⓪&INC (start);⓪$END (* WHILE *);⓪$z [zindex] := nul;⓪$index := VAL (LONGCARD, end);⓪$IF index > ende THEN⓪&LiesPuffer (index, ende, texthandle);⓪$END;⓪ *)⓪"ASSEMBLER⓪&; zindex := 0;⓪&; start := VAL (CARDINAL, index); laenge := laenge + blanks;⓪&MOVE.L index(A6),A0⓪&MOVE.L (A0),D0⓪&MOVE D0,start(A6)⓪&MOVE blanks(A6),D0⓪&ADD D0,laenge(A6)⓪&⓪&; IF laenge > HIGH (z) THEN⓪&; Nachricht ('Sourcezeile ist zu lang!');⓪&; laenge := HIGH (z);⓪&; END;⓪&MOVE.W laenge(A6),D1⓪&CMP.W z+4(A6),D1⓪&BLS nope⓪&MOVE.W z+4(A6),laenge(A6)⓪&END;⓪(Nachricht ('Sourcezeile ist zu lang!');⓪&ASSEMBLER⓪$nope:⓪&⓪&; WHILE blanks > zindex DO z [zindex] := ' '; INC (zindex); END⓪&MOVE blanks(A6),D0⓪&MOVEQ #0,D1⓪&MOVE.L z(A6),A2⓪$while1:⓪&CMP D1,D0⓪&BLS endWhile1⓪&MOVE.B #' ',(A2)+⓪&ADDQ #1,D1⓪&BRA while1⓪$endWhile1:⓪ ⓪$while2:⓪&; WHILE zindex < laenge DO⓪&MOVE laenge(A6),D0⓪&CMP D1,D0⓪&BLS.W endWhile2⓪&; CASE puffer^[start] OF⓪&MOVE.L puffer,A0⓪&MOVE start(A6),D0⓪&MOVE.B 0(A0,D0.W),D0⓪&; tab: ztab := TabWeite * (zindex DIV TabWeite + 1);⓪&; WHILE (zindex < ztab) DO z [zindex] := ' '; INC (zindex); END⓪&CMPI.B #tab,D0⓪&BNE noTAB⓪&MOVE TabWeite(A6),D0⓪&ADDQ #1,D0⓪&MOVEQ #0,D2⓪&MOVE D1,D2⓪&DIVU D0,D2⓪&MULU TabWeite(A6),D2⓪$while3:⓪&CMP D1,D2⓪&BLS endWhile3⓪&MOVE.B #' ',(A2)+⓪&ADDQ #1,D1⓪&BRA while3⓪$endWhile3:⓪&BRA endCase⓪ ⓪$noTAB:⓪&; ELSE z [zindex] := puffer^[start]; INC (zindex);⓪&MOVE.B D0,(A2)+⓪&ADDQ #1,D1⓪ ⓪$endCase:⓪&; END (* CASE *);⓪&; INC (start);⓪&ADDQ #1,start(A6)⓪&BRA while2⓪ ⓪$endWhile2:⓪&; z [zindex] := nul;⓪&CLR.B (A2)+⓪>; MOVE.L zindex(A6),A0⓪>; MOVE D1,(A0)⓪&; index := VAL (LONGCARD, end);⓪&MOVEQ #0,D0⓪&MOVE end(A6),D0⓪&MOVE.L index(A6),A0⓪&MOVE.L D0,(A0)⓪&; IF index > ende THEN⓪&; LiesPuffer (index, ende, texthandle);⓪&; END;⓪&MOVE.L ende(A6),A0⓪&CMP.L (A0),D0⓪&BLS noLies⓪&END;⓪(LiesPuffer (index, ende, texthandle);⓪&ASSEMBLER⓪$noLies:⓪"END (* Assembler *)⓪ END FastCopyExpand;⓪!⓪ PROCEDURE TextLesen (Puff: einPufferPointer; initialisiere: BOOLEAN;⓪5frage, loadconfig, message: BOOLEAN);⓪ (* Stellt yoffset auf 0 *)⓪ ⓪ VAR z, z2: eineZeile;⓪(indent: Moden; (* Menge der Zustaende von Puff *)⓪(Info: eineInfo;⓪(pf, na: eineInfo;⓪(dummys: eineInfo;⓪!⓪(index, ende: LONGCARD;⓪(zindex: CARDINAL;⓪(ok: BOOLEAN;⓪(texthandle: INTEGER;⓪(dummy, dum: CHAR;⓪(button: INTEGER;⓪(nulldeleted: BOOLEAN;⓪(tabsgefiltert: BOOLEAN;⓪(tabsfiltern: BOOLEAN;⓪(dot: ARRAY [0..0] OF CHAR; (* Compilerfehler! *)⓪(⓪(zlaenge, endindex,⓪(blanks: CARDINAL;⓪(dateiende: BOOLEAN;⓪(zeilenende: BOOLEAN; (* Zeilenende steht im Puffer *)⓪ ⓪ VAR PName: eineInfo;⓪(AlteZeilenNummer: CARDINAL;⓪(erstezeilpos, erstecharpos, laufendezeilpos,⓪(laufendecharpos: CARDINAL;⓪(nextpuff: einPufferPointer;⓪(helpline: einLinePointer;⓪(OldPfad: eineInfo;⓪(Message: ARRAY [0..60] OF CHAR;⓪(dname: eineInfo;⓪(suff: ARRAY [0..3] OF CHAR;⓪(h: CARDINAL;⓪(timeptr: ADDRESS;⓪ ⓪ PROCEDURE keinTextNachricht;⓪"BEGIN⓪$Nachricht ('Dies ist kein Text!');⓪"END keinTextNachricht;⓪ ⓪ BEGIN (* TextLesen *)⓪"nulldeleted := FALSE; tabsgefiltert := FALSE;⓪"tabsfiltern := (* TabFiltern IN Puff^.Modus; *) TRUE;⓪"expandBlankCompr := TRUE; (*DLECompr IN Puff^.Modus; *)⓪"IF message THEN CursorAus; END;⓪"REPEAT⓪$IF message THEN⓪&LoescheBild;⓪&SchirmSchreiben (Puff, Puff^.MerkPunkte [LaufendeZeile].merkline, 0, 0);⓪&GotoXY (0, 0);⓪$END (* IF message *);⓪$IF (Editiert IN Puff^.Modus) & initialisiere THEN⓪&IF ~FrageJaNein (Ja, 'Puffer wurde editiert|Überschreiben?')⓪&THEN RETURN END;⓪&LoescheBild;⓪$END (* IF Puffer nicht leer *);⓪$IF Puff^.Pfad [0] = nul THEN⓪&SplitFileName (GlobalPfad, Puff^.Pfad, dname, suff);⓪&IF suff [0] = nul THEN Append ('*.*', Puff^.Pfad, ok);⓪&ELSE Append ('*.', Puff^.Pfad, ok); FastStrings.Append (suff, Puff^.Pfad);⓪&END (* IF suff *);⓪$END (* IF *);⓪$Info := Puff^.Pfad; DeleteTail (Info);⓪$FastStrings.Append (Puff^.Name, Info);⓪$IF message THEN⓪&HighLight; WriteConst (version); Normal; WriteLn; WriteLn;⓪&IF initialisiere THEN Message := 'File lesen';⓪&ELSE Message := 'Block lesen';⓪&END;⓪&HighLight; WriteConst (Info); Normal;⓪&WriteLn;⓪&WriteLn;⓪$END (* IF message *);⓪$IF frage THEN⓪&PName := Puff^.Name;⓪&GetDirectory (Puff^.Pfad, Puff^.Name, Message, button, FALSE);⓪&IF button # 1 THEN⓪(IF ~initialisiere THEN⓪*Puff^.Name := PName;⓪(ELSE Puff^.Name [0] := nul;⓪(END;⓪(RETURN;⓪&END;⓪&GlobalPfad := Puff^.Pfad;⓪&MausEin;⓪&Info := Puff^.Pfad; DeleteTail (Info);⓪&FastStrings.Append (Puff^.Name, Info);⓪$ELSE MausEin;⓪$END (* IF frage *);⓪$Paths.SearchFile (Info, ShellMsg.SrcPaths, Paths.fromStart, ok, Info);⓪$IF ok THEN FileNames.SplitPath (Info, Puff^.Pfad, Puff^.Name); END;⓪$Open (Info, ORD (read), texthandle);⓪$frage := TRUE;⓪"UNTIL (texthandle >= 0);⓪"IF texthandle >= 0 THEN⓪$WITH Puff^ DO⓪'pf := Pfad; na := Name;⓪'IF initialisiere THEN⓪)Loeschen (Puff);⓪)Pfad := pf; Name := na;⓪'END (* IF *);⓪'indent := Modus;⓪'EXCL (Modus, AutoIndent);⓪'dateiende:= FALSE;⓪'index := 0; ende := 0;⓪ ⓪ (****************************** Abspeichern von *.GME ***********************)⓪'IF loadconfig THEN⓪)nextpuff := NaechsterPuffer;⓪)LoadConfig (Puff, FALSE, message);⓪)(* Änderung 10. 6. 89: *)⓪)loadconfig := KonfigSpeichern IN Modus;⓪)(* ******************* *)⓪)indent := Modus;⓪)Pfad := pf; Name := na;⓪)erstezeilpos := MerkPunkte [ErsteZeile].zeilpos;⓪)erstecharpos := MerkPunkte [ErsteZeile].charpos;⓪)laufendezeilpos := MerkPunkte [LaufendeZeile].zeilpos;⓪)laufendecharpos := MerkPunkte [LaufendeZeile].charpos;⓪)ReInit (Puff);⓪'END (* IF loadconfig *);⓪ ⓪'IF message THEN⓪)WriteConst ('Text laden');⓪'END;⓪'IF puffer = NIL THEN⓪)Nachricht ('Speicher reicht|nicht für Puffer');⓪)RETURN;⓪'END (* IF *);⓪'LiesPuffer (index, ende, texthandle);⓪'IF FastLen (texthandle, index, ende, TabWeite,⓪,blanks, zlaenge, endindex, zeilenende, dateiende) THEN⓪)keinTextNachricht; RETURN;⓪'END;⓪'FastCopyExpand (index, ende, texthandle, TabWeite, blanks, zlaenge, endindex, z);⓪'IF ~zeilenende THEN⓪)IF FastLen (texthandle, index, ende, TabWeite,⓪0blanks, zlaenge, endindex, zeilenende, dateiende) THEN⓪+keinTextNachricht; RETURN;⓪)END;⓪)FastCopyExpand (index, ende, texthandle, TabWeite,⓪9blanks, zlaenge, endindex, z2);⓪)FastStrings.Append (z2, z);⓪'END;⓪'(* *)⓪'IF initialisiere THEN⓪)PutLine (MerkPunkte [LaufendeZeile].merkline, z);⓪'ELSE⓪)LineUp (Puff);⓪)InsertLine (Puff, z, FALSE, FALSE, ~initialisiere);⓪'END (* IF *);⓪'IF message THEN⓪)GotoXY (38, 12); HighLight; (* CursorAus; *)⓪)WriteConst (' 0'); MausBusy;⓪'END;⓪'AlteZeilenNummer := 1;⓪'z:= '';⓪'LOOP⓪)IF index > ende THEN⓪+(*Nachricht ('EXIT 1');*)⓪+EXIT⓪)END;⓪)IF FastLen (texthandle, index, ende, TabWeite,⓪1blanks, zlaenge, endindex, zeilenende, dateiende) THEN⓪+keinTextNachricht; EXIT;⓪)END;⓪)(* *)⓪)WITH MerkPunkte [LaufendeZeile] DO⓪+WITH merkline^ DO⓪ ⓪ (********** INLINE-Code fuer einen Sonderfall von InsertLine **********)⓪(⓪-IF initialisiere & zeilenende THEN⓪/NEW (helpline);⓪/IF helpline # NIL THEN⓪1helpline^.terminator [0] := nul;⓪1zindex := zlaenge + blanks;⓪1IF zindex > 0 THEN⓪3WITH helpline^ DO⓪5laenge := (zindex DIV cgrain + 1) * cgrain;⓪!⓪5ALLOCATE (ZeilPointer, VAL (LONGCARD, laenge));⓪5IF ZeilPointer = NIL THEN⓪7DISPOSE (helpline);⓪7Nachricht ('Speicher reicht nicht 1');⓪7EXIT;⓪5ELSE⓪7FastCopyExpand (index, ende, texthandle, TabWeite,⓪Gblanks, zlaenge, endindex, ZeilPointer^);⓪7(* *)⓪7INC (zeilpos); INC (ZeilenAnzahl);⓪5END (* IF noch Speicher *);⓪3END (* WITH *);⓪1ELSE⓪3WITH helpline^ DO⓪5ZeilPointer := ADR (terminator);⓪5laenge := 0;⓪3END (* WITH *);⓪3INC (zeilpos); INC (ZeilenAnzahl);⓪ ⓪3(* Pufferindex weiterschalten!!! *)⓪3FastCopyExpand (index, ende, texthandle, TabWeite,⓪Cblanks, zlaenge, endindex, z2);⓪3(* Dummy-Aufruf zur Zeilenweiterschaltung *)⓪,⓪1END;⓪1IF zeilpos > AlteZeilenNummer THEN⓪3helpline^.vorige := merkline;⓪3helpline^.naechste := NIL;⓪3naechste := helpline;⓪3merkline := helpline;⓪1END (* IF *);⓪/ELSE Nachricht ('Speicher reicht nicht 2');⓪4EXIT;⓪/END (* IF # NIL *);⓪ ⓪ (********** INLINE-Code fuer einen Sonderfall von InsertLine **********)⓪ ⓪-ELSE⓪/(* *)⓪/FastCopyExpand (index, ende, texthandle, TabWeite,⓪?blanks, zlaenge, endindex, z);⓪/IF ~zeilenende THEN⓪1IF FastLen (texthandle, index, ende, TabWeite,⓪5blanks, zlaenge, endindex, zeilenende, dateiende) THEN⓪3keinTextNachricht; EXIT;⓪1END;⓪1FastCopyExpand (index, ende, texthandle, TabWeite,⓪Ablanks, zlaenge, endindex, z2);⓪1FastStrings.Append (z2, z);⓪/END;⓪ ⓪/IF zeilenende OR dateiende OR (index > ende) THEN⓪1InsertLine (Puff, z, FALSE, FALSE, ~initialisiere);⓪/ELSE (* Textende *)⓪1(*Nachricht ('EXIT 2');*)⓪1EXIT;⓪/END (* IF *);⓪/IF dateiende THEN EXIT END;⓪-END (* IF initialisiere *);⓪-IF zeilpos > AlteZeilenNummer THEN⓪/AlteZeilenNummer := zeilpos⓪-ELSE⓪/Nachricht ('Speicher reicht nicht! 3');⓪/EXIT;⓪-END (* IF ZeilenNummer *);⓪+END (* WITH merkline^ *);⓪)END (* WITH *);⓪)IF message & (ZeilenAnzahl MOD 50 = 0) THEN⓪+CursorAus; MausAus; GotoXY (38, 12);⓪+ConvCard (MerkPunkte [LaufendeZeile].zeilpos, 4, dummys);⓪+WriteConst (dummys); MausBusy;⓪)END (* IF *);⓪'END (* LOOP *);⓪'IF message THEN Normal; END;⓪'(*GetDateTime (texthandle, fullDate, fullTime);⓪'datum:= Clock.PackDate (fullDate);⓪'tageszeit:= Clock.PackTime (fullTime)⓪'*)⓪'timeptr := ADR (tageszeit);⓪'DaTime (texthandle, timeptr, getTime);⓪'⓪'ok := Close (texthandle);⓪'Modus := indent;⓪$END (* WITH *);⓪$IF nulldeleted & message THEN⓪&Nachricht ('Null-Characters ausgefiltert!');⓪$END (* IF *);⓪$IF tabsgefiltert & message THEN⓪&Nachricht ('Tab-Zeichen ausgefiltert!');⓪$END (* IF *);⓪"ELSE LoescheBild; HighLight;⓪'Assign ('Datei "', dummys, ok); FastStrings.Append (Info, dummys);⓪'Append ('"|nicht vorhanden!', dummys, ok);⓪'Nachricht (dummys);⓪'Info := "Neue Datei: ";⓪"END (* IF File *);⓪"IF initialisiere THEN⓪$WITH Puff^ DO (* Nach Lesen wieder auf Anfang einstellen *)⓪$⓪&IF loadconfig THEN (* wenn oben auskommentiert... *)⓪((* WriteConst ('restaurieren'); *)⓪(NaechsterPuffer := nextpuff;⓪(MerkPunkte [ErsteZeile].zeilpos := erstezeilpos;⓪(MerkPunkte [ErsteZeile].charpos := erstecharpos;⓪(MerkPunkte [LaufendeZeile].zeilpos := laufendezeilpos;⓪(MerkPunkte [LaufendeZeile].charpos := laufendecharpos;⓪((* ReAdjustMerkpointer (Puff); *)⓪ ⓪(StelleZeileEin (Puff, laufendezeilpos, laufendezeilpos - erstezeilpos);⓪&ELSE⓪(MerkPunkte [ErsteZeile].zeilpos := 0;⓪(MerkPunkte [LaufendeZeile].charpos := 0;⓪(MerkPunkte [LaufendeZeile].zeilpos := 1;⓪(MerkPunkte [LaufendeZeile].merkline := Puffer^.naechste;⓪(MerkPunkte [ErsteZeile].merkline := Puffer^.naechste;⓪&END (* IF loadconfig *);⓪&⓪$END (* WITH *);⓪"ELSE StelleZeileEin (Puff, Puff^.MerkPunkte [LaufendeZeile].zeilpos,⓪7LinesOnScreen DIV 2);⓪"END (* IF *);⓪"WITH Puff^ DO⓪$EXCL (Modus, Exit); EXCL (Modus, Editiert); EXCL (Modus, BlockIstMarkiert);⓪$EXCL (Modus, Compiliert);⓪$MerkPunkte [CompilerInfo].charpos := 0;⓪$MerkPunkte [CompilerInfo].zeilpos := 1;⓪$MerkPunkte [CompilerInfo].merkline := Puffer^.naechste;⓪"END (* WITH *);⓪"Trace ('TextLesen fertig');⓪ END TextLesen;⓪ ⓪ PROCEDURE TextSchreiben (Puff: einPufferPointer; backup, markiert,⓪9frage, saveconfig, controlfil: BOOLEAN;⓪9VAR erfolgreich: BOOLEAN);⓪ (* 'erfolgreich' ist auch TRUE, wenn "Abbruch" beim Selektor gewählt wurde! *)⓪ VAR Help: einLinePointer;⓪(i: CARDINAL;⓪(Info: eineInfo;⓪(BakName: eineInfo;⓪(oldPfad, oldName: eineInfo;⓪ ⓪(index: LONGCARD;⓪(ok: BOOLEAN;⓪(texthandle: INTEGER;⓪(rest: eineZeile;⓪(ende: BOOLEAN;⓪(button: INTEGER;⓪ ⓪"PROCEDURE SchreibPuffer (texthandle: INTEGER): BOOLEAN;⓪"VAR count: LONGCARD;⓪(ok: BOOLEAN;⓪"BEGIN⓪$(* GEMDOS-Funktion 40H, D0 = Resultat (LONGINT) *)⓪$count := index;⓪$Write (texthandle, count, ADDRESS (puffer));⓪$ok := count = index;⓪$(* count sollte negative LONGINT sein, wenn Fehlermeldung,⓪'sonst Echo der geschriebenen Anzahl *)⓪$index := VAL (LONGCARD, 0); (* Puffer wieder vom Anfang her beschreiben *)⓪$RETURN ok;⓪"END SchreibPuffer;⓪!⓪"PROCEDURE SchreibZeile (texthandle: INTEGER; REF z: ARRAY OF CHAR;⓪:keinZeilenEndeAnfuegen: BOOLEAN; VAR ok: BOOLEAN);⓪"VAR (*$Reg*)zindex: CARDINAL;⓪((*$Reg*)l: CARDINAL;⓪((*$Reg*)ztab: CARDINAL;⓪((*$Reg*)ind: CARDINAL;⓪"BEGIN⓪"⓪$zindex := 0; (* Stringanfang *)⓪$(* Zeileninhalt in Puffer schreiben: *)⓪$l := LENGTH (z); (* Laenge des Strings - um 1 groesser als max. Index *)⓪$ok := TRUE;⓪$ind := VAL (CARDINAL, index);⓪$WHILE (ind <= cpuffer) & (zindex < l) & ok DO⓪&IF (z [zindex] < 40C) THEN⓪(IF (z [zindex] = tab) & (TabFiltern IN Puff^.Modus) THEN⓪*ztab := Puff^.TabWeite * ((zindex DIV Puff^.TabWeite) + 1);⓪*WHILE (ztab > 0) & ok DO⓪,puffer^ [ind] := ' '; INC (ind); DEC (ztab);⓪,IF (ind > cpuffer) & ok THEN⓪.index := VAL (LONGCARD, ind);⓪.ok := SchreibPuffer (texthandle);⓪.ind := 0;⓪,END;⓪*END (* WHILE *);⓪*INC (ind);⓪(ELSIF ~controlfil THEN⓪*puffer^ [ind] := z [zindex]; INC (ind);⓪(END (* IF Control-Code *);⓪&ELSE⓪(puffer^ [ind] := z [zindex]; INC (ind);⓪&END (* IF Tab *);⓪&INC (zindex);⓪&IF (ind > cpuffer) & ok THEN⓪(index := VAL (LONGCARD, ind);⓪(ok := SchreibPuffer (texthandle);⓪(ind := 0;⓪&END (* IF *);⓪$END (* WHILE *);⓪$IF ok & NOT keinZeilenEndeAnfuegen THEN⓪&(* cr schreiben: *)⓪&puffer^ [ind] := cr; INC (ind);⓪&IF (ind > cpuffer) & ok THEN⓪(index := VAL (LONGCARD, ind);⓪(ok := SchreibPuffer (texthandle);⓪(ind := 0;⓪&END (* IF *);⓪&(* lf schreiben: *)⓪&puffer^ [ind] := lf; INC (ind);⓪&IF (ind > cpuffer) & ok THEN⓪(index := VAL (LONGCARD, ind);⓪(ok := SchreibPuffer (texthandle);⓪(ind := 0;⓪&END (* IF *);⓪$END;⓪$index := VAL (LONGCARD, ind);⓪"END SchreibZeile;⓪ ⓪ VAR PName: eineInfo;⓪(dummy: CHAR;⓪(dummys: eineInfo;⓪(dot: ARRAY [0..0] OF CHAR; (* Compilerfehler! *)⓪(Message: ARRAY [0..60] OF CHAR;⓪(timeptr: ADDRESS;⓪ ⓪ BEGIN (* TextSchreiben *)⓪"erfolgreich:= FALSE;⓪"WriteChar (bel);⓪"IF (Puff^.Puffer^.naechste^.naechste = NIL) &⓪%(Puff^.Puffer^.naechste^.ZeilPointer^[0] = nul) THEN⓪$erfolgreich:= TRUE;⓪$RETURN⓪"END (* IF Puffer leer *);⓪"CursorAus;⓪"REPEAT⓪$REPEAT⓪&Info := Puff^.Pfad; DeleteTail (Info);⓪&FastStrings.Append (Puff^.Name, Info);⓪&oldPfad := Puff^.Pfad; oldName := Puff^.Name;⓪&GotoXY (0, 0);⓪&HighLight; WriteConst (version); Normal; LoescheZeile;⓪&WriteLn; LoescheZeile; WriteLn; LoescheZeile;⓪&IF markiert THEN Message := 'Fileblock schreiben';⓪&ELSE Message := 'File schreiben';⓪&END;⓪&HighLight;⓪&WriteConst (Info); Normal;⓪&IF frage THEN⓪(PName := Puff^.Name;⓪(GetDirectory (Puff^.Pfad, Puff^.Name, Message, button, FALSE);⓪(IF button # 1 THEN⓪*Puff^.Name := PName;⓪*erfolgreich:= TRUE;⓪*RETURN;⓪(END;⓪(MausEin;⓪&ELSE MausEin;⓪&END (* IF frage *);⓪&(*⓪&IF Puff^.Name [0] = nul THEN⓪(Nachricht ('Noch kein Dateiname angegeben!');⓪&END (* IF kein Name *);⓪&*)⓪&frage := TRUE;⓪$UNTIL Puff^.Name [0] # nul;⓪$Info := Puff^.Pfad; DeleteTail (Info);⓪$FastStrings.Append (Puff^.Name, Info);⓪!⓪$IF ~markiert & (backup OR (MakeBAK IN Puff^.Modus)) THEN⓪&(*⓪(BakName := Info;⓪(dot [0] := '.'; (* Compilerfehler - keine Char-Konstante erlaubt! *)⓪(IF FastStrings.Pos (dot, BakName) > 0 THEN⓪*i := LENGTH (BakName); DEC (i);⓪*WHILE BakName [i] # '.' DO⓪,DEC (i);⓪*END (* WHILE *);⓪*BakName [i] := nul;⓪(END (* IF Punkt *);⓪(Append ('.BAK', BakName, ok);⓪&*)⓪&FileNames.ConcatName (Info, 'BAK', BakName);⓪&ok := Delete (BakName);⓪&Rename (Info, BakName);⓪$END (* IF nicht markiert *);⓪$Create (Info, 0, texthandle);⓪$IF texthandle < 0 THEN⓪&Nachricht ('Fehler beim Erzeugen der Text-Datei');⓪&RETURN;⓪$END (* IF Handle ungueltig *);⓪"UNTIL texthandle >= 0;⓪"WITH Puff^ DO⓪$IF markiert THEN⓪&StelleZeileEin (Puff, MerkPunkte [BlockMarke1].zeilpos, 0);⓪&Help := MerkPunkte [LaufendeZeile].merkline;⓪&i := MerkPunkte [LaufendeZeile].zeilpos;⓪$ELSE⓪&Help := Puffer^.naechste;⓪&i := 1;⓪$END (* IF *);⓪$index := VAL (LONGCARD, 0); ende := FALSE; ok := TRUE;⓪$HighLight;⓪ ⓪$GotoXY (38, 12); HighLight;⓪$WriteConst (' 0'); MausBusy;⓪ ⓪$IF puffer = NIL THEN⓪&Nachricht ('Speicher reicht|nicht für Puffer');⓪&RETURN;⓪$END (* IF *);⓪$WHILE ~ende & ok DO⓪&ende := (Help^.naechste = NIL)⓪/OR (markiert & (i >= MerkPunkte [BlockMarke2].zeilpos));⓪&IF markiert & (i = MerkPunkte [LaufendeZeile].zeilpos) THEN⓪(FastStrings.Copy (Help^.ZeilPointer^, MerkPunkte [BlockMarke1].charpos,⓪.LENGTH (Help^.ZeilPointer^) - MerkPunkte [BlockMarke1].charpos,⓪.rest);⓪(SchreibZeile (texthandle, rest, ende, ok);⓪&ELSIF ende & markiert THEN⓪(FastStrings.Copy (Help^.ZeilPointer^, 0,⓪.MerkPunkte [BlockMarke2].charpos, rest);⓪(SchreibZeile (texthandle, rest, ende, ok);⓪&ELSE⓪(SchreibZeile (texthandle, Help^.ZeilPointer^, ende, ok);⓪&END (* IF *);⓪&Help := Help^.naechste;⓪&INC (i);⓪&IF i MOD 50 = 0 THEN⓪(CursorAus; MausAus; GotoXY (38, 12);⓪(ConvCard (i, 4, dummys);⓪(WriteConst (dummys); MausBusy;⓪&END (* IF *);⓪$END (* WHILE *);⓪$Normal;⓪$IF (index > VAL (LONGCARD, 0)) & ok THEN⓪&ok := SchreibPuffer (texthandle);⓪$END (* IF *);⓪$IF ~ok THEN⓪&Nachricht ('Fehler beim Abspeichern|Eventuell Diskette voll');⓪&LoescheBild;⓪&ok := Close (texthandle);⓪&RETURN⓪$END (* IF ~ok *);⓪$erfolgreich:= Close (texthandle);⓪$Open (Info, ORD (read), texthandle);⓪$timeptr := ADR (tageszeit);⓪$DaTime (texthandle, timeptr, CAST (TimeAccessMode, Compiliert IN Modus));⓪$ok := Close (texthandle);⓪"END (* WITH *);⓪"IF erfolgreich THEN⓪$IF markiert THEN Puff^.Pfad := oldPfad; Puff^.Name := oldName;⓪$ELSIF saveconfig THEN⓪&SaveConfig (Puff, FALSE);⓪$END (* IF *);⓪$AutoCount := 0;⓪$IF NOT markiert THEN⓪&EXCL (Puff^.Modus, Editiert);⓪$END⓪"END⓪ END TextSchreiben;⓪ ⓪ (************************* EditCommand *************************************)⓪ ⓪ CONST cErrName = 'TLGE.ERR';⓪ ⓪ VAR FehlerMeldung: eineInfo;⓪(ErrName: eineInfo;⓪(FehlerText: eineZeile;⓪(Start: CARDINAL;⓪(FehlerStart: einLinePointer;⓪(ok: BOOLEAN;⓪(ErrZeil, ErrPos: CARDINAL;⓪(ErrLine: einLinePointer;⓪(FehlerAnzahl: CARDINAL;⓪(LaufenderFehler: CARDINAL;⓪(Backslash: ARRAY [0..0] OF CHAR;⓪ ⓪"(* Megamax-Modula: *)⓪"PROCEDURE SetCompilerInfo (Puff: einPufferPointer;⓪0VAR FehlerMeldung: ARRAY OF CHAR);⓪"VAR mp, hp: einMerkPointer;⓪(ch: CHAR;⓪"BEGIN⓪%⓪%(* Einstellen der Fehlermeldung in Merkpunktliste Compilerinfo: *)⓪%(* Alte Compilerinfo-Liste löschen: *)⓪$⓪%WITH Puff^.MerkPunkte [CompilerInfo] DO⓪'zeilpos := Puff^.MerkPunkte [LaufendeZeile].zeilpos;⓪'merkline := Puff^.MerkPunkte [LaufendeZeile].merkline;⓪'charpos := Puff^.MerkPunkte [LaufendeZeile].charpos;⓪'PutLine (merkinfo, FehlerMeldung);⓪%END (* WITH *);⓪"END SetCompilerInfo;⓪"⓪"PROCEDURE SetPath;⓪"VAR dummy: eineInfo;⓪(Button: INTEGER;⓪"BEGIN⓪$LoescheBild; (*WriteConst ('Pfad für Dienstprogramme: ');*)⓪$dummy [0] := nul;⓪$GetDirectory (CompilerPfad, dummy, 'Pfad für TDI-Programme', Button, FALSE);⓪$DeleteTail (CompilerPfad);⓪$IF CompilerPfad [0] = nul THEN⓪&CompilerPfad [0] := '\'; CompilerPfad [1] := nul;⓪$END;⓪"END SetPath;⓪ ⓪ (*⓪"PROCEDURE DoRunProgram (Pfadname, Dateiname, Argument: ARRAY OF CHAR): INTEGER;⓪"(* korrigiert von Peter Hellinger *)⓪"⓪"VAR (*Pfadname, Dateiname: eineInfo;*)⓪(Programmname: eineInfo;⓪(Button: INTEGER;⓪(laenge: ARRAY [0..0] OF CHAR;⓪(newDrive, oldDrive: CARDINAL;⓪(map: LONGCARD;⓪(oldPfad: eineInfo;⓪(Result: (*INTEGER*) LONGINT;⓪(key: einTasteneintrag;⓪(b: CHAR;⓪(ok: BOOLEAN;⓪"BEGIN⓪$GEMDOS.GetPath (oldPfad, 0);⓪$GEMDOS.GetDrv (oldDrive);⓪$IF Pfadname [0] = nul THEN⓪&Pfadname [0] := '\'; Pfadname [1] := nul;⓪$END (* IF *);⓪$GotoXY (0, 0);⓪$WriteLine (Pfadname);⓪$Assign (Pfadname, Programmname);⓪$DeleteTail (Programmname);⓪$Append (Dateiname, Programmname); (* Sehr richtig!! *)⓪$⓪$WriteConst ('--> '); WriteLine (Programmname);⓪$WriteConst (': '); WriteLine (Argument);⓪$⓪$laenge [0] := CHR (LENGTH (Argument));⓪$Insert (laenge, 0, Argument);⓪ ⓪$(* Jetzt wirds interessant: *)⓪ ⓪$IF (Programmname [0] >= 'A') & (Programmname [0] <= 'Z') THEN⓪&newDrive := ORD (Programmname [0]) - 65;⓪&IF (newDrive # oldDrive) THEN⓪(GEMDOS.SetDrv (newDrive, map);⓪&END (* IF *);⓪$END (* IF *);⓪$DeleteTail (Pfadname);⓪$IF GEMDOS.SetPath (Pfadname) THEN⓪'MausEin; (* Muss **hier** stehen! *)⓪ ⓪'GEMDOS.Exec (GEMDOS.loadExecute, Programmname, Argument,⓪+Pfadname, Result);⓪ (* WriteConst ('Programm-Resultat: ');⓪&WriteInt (output, Result, 5);⓪&LiesZeichen (b);⓪ *)⓪&TastInit;⓪&(*RestoreFont; (*-- Golem-Font wieder herstellen --*)*)⓪ ⓪$ELSE (* Falscher Pfad! *)⓪&Nachricht ('Illegaler Zugriffspfad');⓪$END (* IF SetPath *);⓪$(* Altes Laufwerk und Pfad restaurieren *)⓪$GEMDOS.SetDrv (oldDrive, map);⓪$ok := GEMDOS.SetPath (oldPfad);⓪$(* Aechz - erstmal auf die Schnelle lokale Anpassung: *)⓪$RETURN VAL (INTEGER, Result);⓪"END DoRunProgram;⓪ *)⓪ ⓪"PROCEDURE CommandLine (VAR FILENAME, FEHLERMELD: ARRAY OF CHAR): BOOLEAN;⓪"VAR I, Z, s: CARDINAL;⓪(CmdLine: POINTER TO ARRAY [0..127] OF CHAR;⓪"BEGIN⓪$CmdLine:= ActiveProcess ();⓪$INC (CmdLine, 128);⓪$IF CmdLine^ [0] = nul THEN (* Ist eigentlich das Längenbyte...*)⓪&(* Wenn Null, keine Commandline. *)⓪&RETURN FALSE⓪$ELSE⓪&(* Komandozeile wurde übergeben *)⓪&⓪&(* Trace ('CommandLine'); *)⓪&⓪&LoescheBild;⓪&(*⓪&GotoXY (2, 2);⓪&WriteConst ('CML: -->'); WriteLine (CmdLine^); WriteLn;⓪&*)⓪&Z := 0;⓪&s := ORD (CmdLine^ [0]);⓪&IF s >= 126 THEN s := 126; END;⓪&I := 1; CmdLine^ [s(*!TT:*)+1] := nul; (* Nullterminierung sicherstellen *)⓪&WHILE (I <= s) & (CmdLine^ [I] > ' ') & (CmdLine^ [I] # nul) DO⓪(FILENAME [Z] := CmdLine^ [I];⓪(INC (Z);⓪(INC (I);⓪&END (* WHILE *);⓪&FILENAME [Z] := nul;⓪ ⓪&Z := 0;⓪&WHILE (I <= s) & (CmdLine^ [I] >= ' ') & (CmdLine^ [I] # nul) DO⓪(FEHLERMELD [Z] := CmdLine^ [I];⓪(INC (Z); INC (I);⓪&END (* WHILE *);⓪&FEHLERMELD [Z] := nul;⓪&⓪&RETURN TRUE⓪$END (* ELSE Kommandozeile vorhanden *);⓪"END CommandLine;⓪ ⓪"PROCEDURE NextArgument (VAR n, arg: ARRAY OF CHAR): BOOLEAN;⓪"(* Kopiert aus n das erste Argument (bis zum Blank) in arg und löscht⓪%es in n. FALSE wenn n der leere String ist. *)⓪"VAR quindex, zindex, laenge: CARDINAL;⓪(delimiter: CHAR;⓪"BEGIN⓪$laenge := LENGTH (n); quindex := 0;⓪$IF laenge = 0 THEN RETURN FALSE; END;⓪$WHILE (n [quindex] = ' ') & (quindex < laenge) DO⓪&INC (quindex);⓪$END;⓪$FastStrings.Delete (n, 0, quindex); laenge := laenge (* + 1 *) - quindex;⓪$zindex := 0; quindex := 0;⓪$IF n [quindex] = '"' THEN⓪&delimiter := '"'; INC (quindex);⓪$ELSE delimiter := ' ';⓪$END;⓪$WHILE (n [quindex] # delimiter) & (quindex < laenge) DO⓪&arg [zindex] := n [quindex];⓪&INC (zindex); INC (quindex);⓪$END (* WHILE *);⓪$(* Skip '"'! *)⓪$IF (n [quindex] = '"') & (quindex < laenge) THEN INC (quindex); END;⓪$FastStrings.Delete (n, 0, quindex);⓪$arg [zindex] := nul;⓪$RETURN arg [0] # nul;⓪"END NextArgument;⓪"⓪"PROCEDURE SplitFileName (name: ARRAY OF CHAR;⓪;VAR path, file, suff: ARRAY OF CHAR);⓪"(* Kopiert den Pfad- und Dateinamensanteil aus name getrennt nach⓪%path und file *)⓪"VAR i, index, laenge, pfadlaenge: CARDINAL;⓪"VAR dummy: ARRAY [0..7] OF CHAR;⓪"BEGIN⓪$FileNames.SplitPath (name, path, file);⓪$FileNames.SplitName (file, dummy, suff);⓪$(* Punkt nach Suff:⓪&Strings.Insert ('.',0,suff,BOOLEAN);⓪$*)⓪"END SplitFileName;⓪ ⓪"PROCEDURE GetScrapPath (VAR ScrapPfad, ScrapName: ARRAY OF CHAR);⓪ (*⓪"CONST cClipVar = 'CLIPBRD';⓪"⓪"VAR clipPath: eineInfo;⓪*bootdev[0446H]: CARDINAL;⓪*bootfrom: CARDINAL;⓪*stack: ADDRESS;⓪*clipVar: ARRAY [0..8] OF CHAR;⓪*ok: BOOLEAN;⓪ *)⓪"VAR dummySuff: (*einSuffix*) ARRAY [0..3] OF CHAR;⓪"BEGIN⓪ (*⓪$AESMisc.ReadScrapDir (ScrapPfad);⓪$IF ScrapPfad [0] = nul THEN⓪&clipVar:= cClipVar;⓪&AESMisc.ShellEnvironment (clipVar, clipPath);⓪&IF clipPath [0] # nul THEN⓪((*Nachricht (clipPath);*)⓪(Assign (clipPath, ScrapPfad);⓪&ELSE⓪((*Nachricht ('warnix|');*)⓪(SysUtil1.SuperPeek (ADR (bootdev), bootfrom);⓪(Strings.Assign (':\CLIPBRD\SCRAP.TXT', ScrapPfad, ok);⓪(Strings.Insert (CHR (bootfrom + ORD ('A')), 0, ScrapPfad, ok);⓪&END (* IF clipPath *);⓪&AESMisc.WriteScrapDir (ScrapPfad);⓪$END (* IF ScrapPfad *);⓪ *)⓪$MakeScrapName ('TXT', ScrapPfad);⓪$SplitFileName (ScrapPfad, ScrapPfad, ScrapName, dummySuff);⓪$FastStrings.Assign (ScrapPfad, ClipBoard^.Pfad);⓪$FastStrings.Assign (ScrapName, ClipBoard^.Name);⓪"END GetScrapPath;⓪ ⓪ (* ENDE EditCommand *)⓪ ⓪ VAR f: PathCtrl.PathEntry;⓪((*ok: BOOLEAN;*)⓪(result: INTEGER;⓪ ⓪ BEGIN (* EditFile *)⓪ ⓪ (* EditCommand *)⓪"BackPointer := NIL;⓪"⓪"InitBuffer;⓪ ⓪ (* !JL 12. 12. 90 *)⓪"NEW (puffer);⓪"IF puffer = NIL THEN OutOfMemory END;⓪"expandBlankCompr := TRUE;⓪ ⓪"NEW (ConfigPuffer);⓪"IF ConfigPuffer = NIL THEN OutOfMemory END;⓪"PuffInit (ConfigPuffer);⓪"IF ConfigPuffer = NIL THEN⓪$Nachricht ('Kann ConfigPuffer|nicht anlegen.109');⓪$RETURN;⓪"END;⓪"ConfigPuffer^.NaechsterPuffer := ConfigPuffer;⓪"ConfigInit := FALSE;⓪"InitConfig (ConfigPuffer);⓪"ConfigInit := TRUE;⓪"ConfigPuffer^.Name := DefaultConfigName;⓪"FileNames.ConcatPath (ShellPath, ConfigPuffer^.Name, ConfigPuffer^.Pfad);⓪"IF KonfigSpeichern IN ConfigPuffer^.Modus THEN⓪$LoadConfig (ConfigPuffer, FALSE, TRUE);⓪"END;⓪"⓪"NEW (HilfsPuffer);⓪"IF HilfsPuffer = NIL THEN OutOfMemory END;⓪"PuffInit (HilfsPuffer);⓪"IF HilfsPuffer = NIL THEN⓪$Nachricht ('Kann Hilfspuffer|nicht anlegen.110');⓪$RETURN;⓪"END;⓪"HilfsPuffer^.NaechsterPuffer := HilfsPuffer;⓪"EditPuffer := InsertPuffer (HilfsPuffer);⓪"Tausch := EditPuffer; MailPuffer := EditPuffer; GolemPuffer := EditPuffer;⓪"AlternEdit := EditPuffer;⓪"NEW (ClipBoard);⓪"IF ClipBoard = NIL THEN OutOfMemory END;⓪"PuffInit (ClipBoard);⓪"IF ClipBoard = NIL THEN⓪$Nachricht ('Kann ClipBoard|nicht anlegen.111');⓪$RETURN;⓪"END;⓪"ClipBoard^.NaechsterPuffer := ClipBoard;⓪"NEW (UndoPuffer);⓪"IF UndoPuffer = NIL THEN OutOfMemory END;⓪"PuffInit (UndoPuffer);⓪"IF UndoPuffer = NIL THEN⓪$Nachricht ('Kann UndoPuffer|nicht anlegen.112');⓪$RETURN;⓪"END;⓪"UndoPuffer^.NaechsterPuffer := UndoPuffer;⓪"⓪"NEW (FehlerPuffer);⓪"IF FehlerPuffer = NIL THEN OutOfMemory END;⓪"PuffInit (FehlerPuffer);⓪"IF UndoPuffer = NIL THEN⓪$Nachricht ('Kann FehlerPuffer|nicht anlegen.112');⓪$RETURN;⓪"END;⓪"FehlerPuffer^.NaechsterPuffer := FehlerPuffer;⓪"FastStrings.Assign (cErrName, ErrName);⓪"FehlerMeldung := '';⓪"GetPfad (CompilerPfad); DeleteTail (CompilerPfad);⓪"GetScrapPath (ScrapPfad, ScrapName);⓪"(* DoClipboard := FALSE; *) (* IN GMEBase!!! *)⓪ ⓪ (* EditFile *)⓪ ⓪"Trace ('EditFile');⓪"GetVersion (version); GlobalPfad [0] := nul; (*GetPfad (GlobalPfad);*)⓪"Lists.ResetList (ShellMsg.SrcPaths);⓪"f := Lists.NextEntry (ShellMsg.SrcPaths);⓪"⓪"IF f # NIL THEN⓪$FastStrings.Assign (f^, GlobalPfad);⓪$Paths.MakeFullName (GlobalPfad, FALSE, ok);⓪"END;⓪"⓪"Directory.MakeFullPath (GlobalPfad, result);⓪"IF result < 0 THEN⓪$GlobalPfad:= '';⓪$GetPfad (GlobalPfad);⓪"END;⓪"(*!TT 18.12.90 - steht oben schon einmal⓪$NEW (puffer);⓪"*)⓪"expandBlankCompr := TRUE;⓪ END GMEFile.⓪ ⓪ ə
- (* $FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82D$FFF0A82DÇ$00008356T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$0000BC45$FFEB97DE$00001AD8$0000BB22$0000BC14$0000BBB3$0000BB6A$00001F53$0000BC76$0000BB9D$00000431$000082F2$00009C46$00008356$0000832C$00008356ÇÇé*)
-